// src/main/java/com/dbms/common/RID.java
package com.dbms.common;

import java.util.Objects;

/**
 * RID (Record ID / 记录标识符) 类。
 * 它在数据库内部唯一地标识了一个元组（Tuple）在磁盘上的物理存储位置。
 * RID由两个部分组成：
 * 1.  页号 (pageId): 记录所在的物理页面的ID。
 * 2.  槽号 (slotNum): 记录在该页面内的槽位索引。
 */
public class RID {
    private final int pageId;
    private final int slotNum;

    /**
     * RID 的构造函数。
     * @param pageId  页面ID。
     * @param slotNum 槽位号。
     */
    public RID(int pageId, int slotNum) {
        this.pageId = pageId;
        this.slotNum = slotNum;
    }

    // --- Getter 方法 ---

    public int getPageId() {
        return pageId;
    }

    public int getSlotNum() {
        return slotNum;
    }

    /**
     * 重写 equals 方法，用于判断两个 RID 是否指向同一个物理位置。
     * 只有当 pageId 和 slotNum 都相同时，两个 RID 才被认为是相等的。
     * @param o 要比较的对象。
     * @return 如果相等则返回 true。
     */
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        RID rid = (RID) o;
        return pageId == rid.pageId && slotNum == rid.slotNum;
    }

    /**
     * 重写 hashCode 方法。
     * 这确保了相等的 RID 对象会产生相同的哈希码，
     * 这对于将 RID 对象用作哈希表（如 HashMap, HashSet）的键是必需的。
     * @return 该对象的哈希码。
     */
    @Override
    public int hashCode() {
        return Objects.hash(pageId, slotNum);
    }

    /**
     * 重写 toString 方法，提供一个易于调试的字符串表示。
     * @return RID 的字符串形式，e.g., "RID{pageId=10, slotNum=3}"。
     */
    @Override
    public String toString() {
        return "RID{" + "pageId=" + pageId + ", slotNum=" + slotNum + '}';
    }
}